Glueのジョブどこから実行しよう..トリガー?ワークフロー?Step Functions?
ETLのワークロードが単一のGlueジョブ(以下、ジョブ)で済むのであれば、Glueのトリガー(以下、トリガー)や、EventBridgeと連携させたLambda Functionなどで実行すればいいと思いますが、ジョブ同士が依存関係を持ったり、Glue以外での処理が見込まれる場合、どう設計しておくべきか...
今回はジョブの実行/管理で検討できそうな、トリガー、ワークフローがどういったものか簡単に整理しつつ、どうやって実行/管理した方がよさそうか考えてみました。
トリガー
Glueにはトリガーと呼ばれるオブジェクトがあり、手動または自動で1つ以上のクローラーや、ジョブを実行することができます。
トリガーには起動方法が設定でき、以下を指定することが可能です。
- スケジュール…固定のサイクルを指定(毎日24時など)
- オンデマンド…コンソールやAPIから実行
- ジョブイベント…他のジョブイベント
ジョブ間に依存関係がない場合、上記、例1、2のような構成となり、スケジュールまたはオンデマンドにて、トリガーを開始しジョブを実行することが可能です。
一方、ジョブ1の結果によりジョブ2の実行を行うなど、ジョブに依存関係がある場合、起動タイプはジョブイベントになります。他のジョブ(ここでは下図ジョブ1)の完了結果をもって、実行されるジョブ(ここでは下図ジョブ2)は、依存関係にあるジョブ(ここでは下図ジョブ1)もトリガーによって開始する必要がある点についてご留意ください。
ドキュメントの記載を抜粋しておきます。
他のジョブまたはクローラの完了の結果として実行されるジョブまたはクローラは、依存関係にあると言われます。依存関係にあるジョブまたはクローラは、完了したジョブまたはクローラがトリガーによって開始された場合にのみ開始されます。 依存関係チェーンのすべてのジョブまたはクローラは、1 つのスケジュールまたはオンデマンドトリガーの子であることが必要です。
なお、現時点でGlueのコンソールから作成できるトリガーはジョブ(クローラー不可)のみとなっております。
トリガーが1つ2つ程度であれば、ワークロードをトリガーで管理してもよさそうですが、トリガーが5個以上など規模が大きいワークロードでは、メンテナンスの負荷が高くなってくると思います。
規模の大きなワークロードが見込まれる場合(見込まれなくても)、次に紹介するワークフローを利用する方がよさそうです。
ワークフロー
Glueにはワークフローと呼ばれる機能があり、作成済みのジョブ、クローラーを用いて、ワークロードの作成、実行、管理が行えます。ワークフローを用いることで、ジョブの依存関係や、処理の進捗状況、問題のトラブルシューティングが容易になります。ワークフローは、Glueコンソール上から定義化可能です。
ワークフローには以下の制限がありますので、ご注意ください。
トリガーは 1 つのワークフローにのみ関連付けることができます。 1 つの開始トリガー (オンデマンドまたはスケジュール) のみが許可されます。 ワークフロー内のジョブまたはクローラがワークフロー外のトリガーによって開始された場合、ジョブまたはクローラの完了 (成功またはその他) に依存するワークフロー内のトリガーは起動されません。 同様に、ワークフロー内のジョブまたはクローラに、ワークフロー内とワークフロー外の両方でジョブまたはクローラの完了 (成功またはその他) に依存するトリガーがある場合、ジョブまたはクローラがワークフロー内から開始されると、ジョブまたはクローラの完了時、ワークフロー内のトリガーのみが起動されます。
制限に問題がなければ、積極的にワークフローを利用していきたいところです。ワークフローの作成方法など、詳細については以下を参考にしてください。
Step Functions
Step FunctionsのAWS統合(Taskステートから直接の呼び出し)では、 ジョブの実行がサポートされていますので、Lambda Functionを介さず、直接ジョブを実行することが可能です。(同期、非同期呼び出し可)
大規模なワークロード、Glueだけで処理が完結しないような場合は、Step Functionsを使用してジョブの実行/管理を検討したいところです。
出典:Step FunctionでAWS Glueのジョブやクローラーを呼び出すワークフローをつくってみた!
なお、現時点でクローラーはStep FunctionsのAWS統合には対応していないので、Lambda Functionを介した実行が必要になります。
Step FunctionsはEventBridgeからも呼び出し可能なので、処理の起点をAWSイベントから開始することも可能になります。
まとめ
ETLワークロードの規模に応じてジョブ実行/管理について検討する必要があります。ワークロードが単一のジョブであればシンプルにトリガー、依存関係をもつような処理が見込まれたらワークフロー。Glueだけで処理が完結しないような場合は、Step Functions。こんな感じで考えてもよさそうですね。ETLワークロード設計の参考になれば幸いです。